#pragma once
#include <string>

const int defaultvaluse = 0;
#define BUFFSIZE 128

enum
{
    ok = 0,
    div_zero,
    mod_zero,
    unknow
};

const std::string opres = "+-*&()%";

class Task
{
public:
    Task()
    {
    }
    Task(int x, int y, char op)
        : _data_x(x), _data_y(y), _oper(op), _code(ok), _reslut(defaultvaluse)
    {
    }
    void operator()()
    {
        Run();
    }
    void Run()
    {
        switch (_oper)
        {
        case '+':
            _reslut = _data_x + _data_y;
            break;
        case '-':
            _reslut = _data_x - _data_y;
            break;
        case '*':
            _reslut = _data_x * _data_y;
            break;
        case '/':
        {
            if (_data_y == 0)
            {
                _reslut = 0;
                _code = div_zero;
            }
            else
            {
                _reslut = _data_x / _data_y;
            }
            break;
        }
        case '%':
        {
            if (_data_y == 0)
            {
                _reslut = 0;
                _code = mod_zero;
            }
            else
            {
                _reslut = _data_x % _data_y;
            }
            break;
        }
        default:
            _code = unknow;
            break;
        }
    }

    std::string PrintTask()
    {
        char buff[BUFFSIZE];
        snprintf(buff, sizeof(buff), "%d %c %d = ?", _data_x, _oper, _data_y);
        return buff;
    }

    std::string PrintResult()
    {
        char buff[BUFFSIZE];
        snprintf(buff, sizeof(buff), "%d %c %d = %d  [%d]", _data_x, _oper, _data_y, _reslut, _code);
        return buff;
    }

    ~Task()
    {
    }

private:
    int _data_x;
    int _data_y;
    char _oper; /*+ - * / %*/

    int _reslut;
    int _code;
};